

#ifndef UC_GEPONSRF_H
#define UC_GEPONSRF_H

#include "zgepent3d.h"
#pragma pack (push, 8)

class UcGeSurface;

class
GE_DLLEXPIMPORT
UcGePointOnSurface : public UcGePointEnt3d
{
public:
    UcGePointOnSurface();
    UcGePointOnSurface(const UcGeSurface& surf);
    UcGePointOnSurface(const UcGeSurface& surf, const UcGePoint2d& param);
    UcGePointOnSurface(const UcGePointOnSurface& src);

    UcGePointOnSurface& operator =     (const UcGePointOnSurface& src);

    const UcGeSurface*  surface        () const;
    UcGePoint2d         parameter      () const;

    UcGePoint3d         point          () const;
    UcGePoint3d         point          (const UcGePoint2d& param );
    UcGePoint3d         point          (const UcGeSurface& surf,
                                        const UcGePoint2d& param);

    UcGeVector3d        normal         () const;
    UcGeVector3d        normal         (const UcGePoint2d& param );
    UcGeVector3d        normal         (const UcGeSurface& surf,
                                        const UcGePoint2d& param);

    UcGeVector3d        uDeriv         (int order) const;
    UcGeVector3d        uDeriv         (int order, const UcGePoint2d& param);
    UcGeVector3d        uDeriv         (int order, const UcGeSurface& surf,
                                        const UcGePoint2d& param);

    UcGeVector3d        vDeriv         (int order) const;
    UcGeVector3d        vDeriv         (int order, const UcGePoint2d& param);
    UcGeVector3d        vDeriv         (int order, const UcGeSurface& surf,
                                        const UcGePoint2d& param);

    UcGeVector3d        mixedPartial   () const;
    UcGeVector3d        mixedPartial   (const UcGePoint2d& param);
    UcGeVector3d        mixedPartial   (const UcGeSurface& surf,
                                        const UcGePoint2d& param);

    UcGeVector3d        tangentVector  (const UcGeVector2d& vec) const;
    UcGeVector3d        tangentVector  (const UcGeVector2d& vec,
                                        const UcGePoint2d& param);
    UcGeVector3d        tangentVector  (const UcGeVector2d& vec,
                                        const UcGeSurface& vecSurf,
                                        const UcGePoint2d& param);

    UcGeVector2d        inverseTangentVector  (const UcGeVector3d& vec) const;
    UcGeVector2d        inverseTangentVector  (const UcGeVector3d& vec,
                                               const UcGePoint2d& param);
    UcGeVector2d        inverseTangentVector  (const UcGeVector3d& vec,
                                               const UcGeSurface& surf,
                                               const UcGePoint2d& param);

    UcGePointOnSurface& setSurface     (const UcGeSurface& surf);
    UcGePointOnSurface& setParameter   (const UcGePoint2d& param);
};

#pragma pack (pop)
#endif

